package com.javasea.qrprint;

import com.javasea.qrprint.controller.SampleController;
import com.javasea.qrprint.util.*;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Optional;

public class Demo extends Application {
    private WritableImage image;
    private ImageView bitMapImageView = new ImageView();
    private String printModel = "TSC MF3400";

    @Override
    public void start(Stage primaryStage) throws Exception{
        /** 边界布局放置组件 */
        BorderPane borderPane = new BorderPane();

        /** 添加菜单 */
        MenuBar menuBar = getMenu();
        borderPane.getChildren().addAll(menuBar);

        /** 添加工具类 */
        ToolBar toolBar = getToolBar();
        borderPane.setTop(toolBar);

        /** 获取自定义标签页面 */
        Pane qrLabelPane = getCenterPane();
        borderPane.setCenter(qrLabelPane);

        /** 添加pane到primaryStage */
        setRootPaneInfo(primaryStage, borderPane);

        /** 初始化UI提示 */
        showTips(primaryStage);

        /** 截图 */
        takeSnapShot(qrLabelPane);
    }

    private void showTips(Stage primaryStage) {
        UiUtil.scheduleInit(primaryStage);
        UiUtil.popupStartupConfirm(primaryStage);
    }

    private void setRootPaneInfo(Stage primaryStage, BorderPane borderPane) {
        primaryStage.setScene(new Scene(borderPane));
        primaryStage.setTitle("公司简介");
        primaryStage.show();
    }

    private Pane getCenterPane() throws IOException {
        FXMLLoader rootLoader = new FXMLLoader(getClass().getClassLoader().getResource("fxml/SampleController2.fxml"));
        Pane qrLabelPane = rootLoader.load();
        SampleController controller = rootLoader.getController();
        controller.setQr("https://www.kbmis.yjtjckj.com/qr/show/company");
        return qrLabelPane;
    }

    private void takeSnapShot(Pane qrLabelPane){
        image = FxImageUtil.takeSnapShot(qrLabelPane);
    }

    private ToolBar getToolBar() {
        Label labelPrintModel = new Label();
        labelPrintModel.setText("打印机型号: TSC MF3400; ");
        labelPrintModel.setStyle("-fx-text-fill:Blue;");

        Label labelLabelSize = new Label();
        labelLabelSize.setText("标签纸类型: 50100");
        labelLabelSize.setStyle("-fx-text-fill:Blue;");

        Button btnPrintModel = new Button("选择打印机型号", new ImageView("img/dyj3.png"));
        //设置只显示按钮上的图标
        btnPrintModel.setContentDisplay(ContentDisplay.LEFT);
        //打开按钮的时间监听
        btnPrintModel.setOnAction(r-> {
            // 实体化TextInputDialog对象，并直接在建构子设置缺省的文本内容。由于输入一定是字符串，所以对话框会直接回传String对象，而不使用泛型
            final TextInputDialog textInputDialog = new TextInputDialog("TSC MF3400");
            // 设置对话框窗口的标题列文本
            textInputDialog.setTitle("填写打印机型号");
            // 设置对话框窗口里的标头文本。若设为空字符串，则表示无标头
//            textInputDialog.setHeaderText("回答以下题目");
            // 设置对话框的消息文本
            textInputDialog.setContentText("您打印机型号是？");
            // 显示对话框，并等待对话框被关闭时才继续运行之后的程序。
            final Optional<String> opt = textInputDialog.showAndWait();
            String rtn;
            try{
                // 可以直接用「textInputDialog.getResult()」来取代
                rtn = opt.get();
                labelPrintModel.setText("打印机型号：" + rtn + "; ");
                printModel = rtn;
//                labelPrintModel.setStyle("-fx-color:Blue;");
            }catch(final NoSuchElementException ex){
                rtn = null;
            }
            if(rtn == null){
                //没有确认输入文本，而是直接关闭对话框
                System.out.println("没有回答");
            }else{
                System.out.println("您的回答是：" + rtn);
            }
        });


        Button btnLabelSize = new Button("选择标签大小", new ImageView("img/bqz3.png"));
        //设置只显示按钮上的图标
        btnLabelSize.setContentDisplay(ContentDisplay.LEFT);
        //打开按钮的时间监听
        btnLabelSize.setOnAction(r-> {
//            final ChoiceDialog<String> choiceDialog = new ChoiceDialog("50100","4060","4080","5080","50100"); // 实体化ChoiceDialog对象，并直接在建构子设置对话框菜单的内容。注意这里将泛型指定为String，所以ChoiceDialog可传入String对象，也会回传被选择的String对象
            final ChoiceDialog<String> choiceDialog = new ChoiceDialog<>("50100");
            choiceDialog.setTitle("标签大小选择"); //设置对话框窗口的标题列文本
            choiceDialog.setHeaderText(""); //设置对话框窗口里的标头文本。若设为空字符串，则表示无标头
            choiceDialog.setContentText("请选择您的标签大小类型："); //设置对话框的消息文本
            final Optional<String> opt = choiceDialog.showAndWait(); //显示对话框，并等待对话框被关闭时才继续运行之后的程序
            String rtn;
            try{
                rtn = opt.get(); //可以直接用「choiceDialog.getResult()」来取代
                labelLabelSize.setText("标签纸类型: " + rtn);
            }catch(final NoSuchElementException ex){
                rtn = null;
            }
            if(rtn == null){
                //没有选择生肖，而是直接关闭对话框
                System.out.println("没有选择");
            }else{
                System.out.println("您属" + rtn + "！");
            }
        });


        Button btnOpen = new Button("打印",new ImageView("img/dyj.png"));
        //设置只显示按钮上的图标
//        btnOpen.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        btnOpen.setContentDisplay(ContentDisplay.LEFT);
        //设置当鼠标悬浮在图标上的提示信息
        btnOpen.setTooltip(new Tooltip("打印"));
        //打开按钮的时间监听
        btnOpen.setOnAction(r-> {
            print();
        });

        //设创建工具栏
        return new ToolBar(btnPrintModel, btnLabelSize, btnOpen, labelPrintModel, labelLabelSize);
    }

    private MenuBar getMenu() {
        MenuBar menuBar = new MenuBar();
        // --- Menu File
        Menu menuFile = new Menu("File");
        // --- Menu Edit
        Menu menuEdit = new Menu("Edit");
        // --- Menu View
        Menu menuView = new Menu("View");
        MenuItem fileMenuItem = new MenuItem("打印",
                new ImageView(new Image("img/tray_logo.png")));
        fileMenuItem.setOnAction((ActionEvent t) -> {
                print();
        });
        menuFile.getItems().add(fileMenuItem);
        menuBar.getMenus().addAll(menuFile, menuEdit, menuView);
        return menuBar;
    }

    private void print() {
        System.out.println("print");
        try {
            byte[] bytes = TscCommandUtil.makeBitmapAndCmd(image, bitMapImageView);
            // 发送打印指令到打印机打印
            TscCommandUtil.executePrintCmd(bytes, printModel);
            TrayOperatorUtil.trayMessage("开始打印 公司简介二维码");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
